1.需求
通过Spark SQL JDBC 方法,抽取Oracle表数据。
2.问题
大数据开发人员反映,使用效果上列表分区优于散列分区。但Spark SQL JDBC方法只支持数字类型分区,而业务表的列表分区字段是个字符串。目前Oracle表使用列表分区,对省级代码分 区。
参考 http://spark.apache.org/docs/1.6.2/sql-programming-guide.html#jdbc-to-other-databases
3.Oracle的分区
3.1列表分区:
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
例一:
1 | CREATE TABLE PROBLEM_TICKETS |
3.2散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
例一:
1 | CREATE TABLE HASH_TABLE |
4.改造
蓝色代码是改造Spark源代码,加课程顾问领取PDF。
1) Spark SQL JDBC的建表脚本中需要加入列表分区配置项。
1 | CREATE TEMPORARY TABLE TBLS_IN |
2)程序入口org.apache.spark.sql.execution.datasources.jdbc.DefaultSource,方法createRelation
1 | override def createRelation( |
3)org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation,方法columnPartition
1 | def columnPartition(partitioning: JDBCPartitioningInfo): Array[Partition] = { |
4)对外方法org.apache.spark.sql.SQLContext , 方法jdbc
1 | def jdbc( |